package com.xiaomage.sax.demo;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;

/**
 * Created by Administrator on 2018/1/31.
 * 自己写的继承DefaultHandler的类
 */

public class SAXHandler extends DefaultHandler {
    private Person person;
    private ArrayList<Person> persons;
    //当前解析的元素标签
    private String tagName=null;

    @Override
    public void startDocument() throws SAXException {
        //读取到文档开始时出发，一般在此处完成一些初始化
        persons=new ArrayList<>();
        ForLog.e("读取到文档头，开始解析XML");
    }


    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        //读到一个开始标签时调用,
        // localName为标签名,最后一个参数为属性数组
        if("person".equals(localName)){
            person=new Person();
            person.setId(Integer.parseInt(attributes.getValue("id")));
            ForLog.e("开始处理person元素");
        }
        tagName=localName;
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        //读到到内容,第一个参数为字符串内容,后面依次为起始位置与长度

        //首先判断当前标签是否有效
        if(tagName!=null){
            //如果有效

            //读取内容
            String data=new String(ch,start,length);

            //根据标签名获取对应属性这
            if("name".equals(tagName)){
                person.setName(data);
                ForLog.e("获取到对应属性name的值（"+data+"）");
            }else if("age".equals(tagName)){
                person.setAge(Integer.parseInt(data));
                ForLog.e("获取到对应属性age的值（"+data+"）");
            }

        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        // 处理元素结束时触发,这里将对象添加到结合中
        if("person".equals(localName)){
            persons.add(person);
            person=null;
            ForLog.e("将person当道persons数组中，同时person数据为："+person);
        }
        tagName=null;
    }

    @Override
    public void endDocument() throws SAXException {
        //读取到文档结尾时触发，
        ForLog.e("读取到文档结尾");
    }
    public ArrayList<Person> getPersons() {
        return persons;
    }
}
